/**
 * @file stereo_monitor.h
 * @brief 立体视觉监测模块（双800W摄像头）
 * @version 2.0
 * @date 2023-03-15
 * @note 该模块处理两个800W摄像头数据，用于测量远端真实线缆的覆冰厚度
 */

#ifndef STEREO_MONITOR_H
#define STEREO_MONITOR_H

#include <stdbool.h>
#include <stdint.h>  // 添加这行以支持 uint8_t 类型
#include "common_defs.h" // 包含通用常量定义，如MAX_PATH_LENGTH
#include "visual_monitor.h" // 包含ImageFrame结构体定义

#ifdef __cplusplus
extern "C" {
#endif

// 立体视觉监测配置
typedef struct {
    char left_camera_url[MAX_PATH_LENGTH];  // 左摄像头URL
    char right_camera_url[MAX_PATH_LENGTH]; // 右摄像头URL
    char left_camera_ip[64];                // 左摄像头IP
    char right_camera_ip[64];               // 右摄像头IP
    char username[32];                      // 用户名
    char password[32];                      // 密码
    int width;                              // 图像宽度
    int height;                             // 图像高度
    int fps;                                // 帧率
    int timeout_ms;                         // 连接超时时间(毫秒)
    float baseline;                         // 基线距离(mm)
    float focal_length;                     // 焦距(mm)
    float cable_diameter;                   // 导线直径(mm)
} StereoMonitorConfig;

// 立体视觉数据
typedef struct {
    float thickness;            // 覆冰厚度(mm)
    float volume;               // 覆冰体积(cm³)
    float distance;             // 距离(m)
    float disparity;            // 视差(像素)
    float cable_diameter;       // 线缆直径(mm)
    long timestamp;             // 时间戳
    ImageFrame left_frame;      // 左摄像头图像帧
    ImageFrame right_frame;     // 右摄像头图像帧
    
    // 新增季节相关视觉特征字段
    uint8_t measurement_conditions; // 测量条件(低4位:季节, 高4位:冰相)
    uint8_t visual_quality;         // 视觉质量指数(0-100)
} StereoData;

/**
 * @brief 初始化立体视觉监测模块
 * 
 * @param config 立体视觉监测配置
 * @return int 成功返回0，失败返回非0
 */
int init_stereo_monitor(StereoMonitorConfig *config);

/**
 * @brief 清理立体视觉监测模块资源
 */
void cleanup_stereo_monitor(void);

/**
 * @brief 获取立体视觉数据
 * 
 * @param data 输出的立体视觉数据
 * @return int 成功返回0，失败返回非0
 */
int get_stereo_data(StereoData *data);

/**
 * @brief 获取最新的立体视觉数据
 * 
 * @param data 输出的立体视觉数据
 * @return int 成功返回0，失败返回非0
 */
int get_latest_stereo_data(StereoData *data);

/**
 * @brief 启动立体视觉监测线程
 * 
 * @return int 成功返回0，失败返回非0
 */
int start_stereo_monitor_thread(void);

/**
 * @brief 停止立体视觉监测线程
 * 
 * @return int 成功返回0，失败返回非0
 */
int stop_stereo_monitor_thread(void);

#ifdef __cplusplus
}
#endif

#endif /* STEREO_MONITOR_H */ 